package fei.zhou.jwtlearn;

import static io.jsonwebtoken.SignatureAlgorithm.HS256;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;

@SpringBootTest
class JWTTest1 {
    
    @Test
    void t1() {
        
        JwtBuilder builder = Jwts.builder().setId("888") // 设置唯一编号
                .setSubject("小白") // 设置主题 可以是JSON数据
                .setIssuedAt(new Date()) // 设置签发日期
                .signWith(HS256, "feizhou");// 设置签名 使用HS256算法，并设置SecretKey(字符串)
        
        // 构建token字符串
        String compact = builder.compact();
        System.out.println("生成token---->>" + compact);
        // 生成token---->>eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE2MDg2MDMxNDd9.GkMVzdOox0Aw951ZFCZUefFbfjytkjerppTwo-2nUzo
    }
    
    @Test
    void t2() {
        String compactJwt = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE2MDg2MDMxNDd9.GkMVzdOox0Aw951ZFCZUefFbfjytkjerppTwo-2nUzo";
        Claims claims = Jwts.parser().setSigningKey("feizhou").parseClaimsJws(compactJwt).getBody();
        System.out.println("解析token---->>" + claims);
        // 解析token---->>{jti=888, sub=小白, iat=1608603147}
    }
    
    @Test
    void t3() {
        // 设置过期时间
        Date date = new Date();
        JwtBuilder builder = Jwts.builder().setId("888") // 设置唯一编号
                .setSubject("小白") // 设置主题 可以是JSON数据
                .setIssuedAt(date) // 设置签发日期
                .setExpiration(date)// 用于设置过期时间 ，参数为Date类型数据
                .signWith(HS256, "feizhou");// 设置签名 使用HS256算法，并设置SecretKey(字符串)
        
        // 构建 并返回一个字符串
        String compact = builder.compact();
        System.out.println("生成token---->>" + compact);
        // 生成token---->>eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE2MDg2MDMyMzcsImV4cCI6MTYwODYwMzIzN30.7GH9s4n0EfqCty7uug8KomZ5xslMoqTAqeRCdN_IlNc
    }
    
    @Test
    void t4() {
        // token学习扩展
        Date date = new Date();
        JwtBuilder builder = Jwts.builder().setId("888") // 设置唯一编号
                .setSubject("小白") // 设置主题 可以是JSON数据
                .setIssuedAt(date) // 设置签发日期
                // .setExpiration(date)//用于设置过期时间 ，参数为Date类型数据
                .signWith(HS256, "feizhou");// 设置签名 使用HS256算法，并设置SecretKey(字符串)
        
        // token信息扩展
        Map<String, Object> map = new HashMap<>();
        map.put("userId", 1);
        map.put("userName", "小明");
        
        builder.addClaims(map);
        // 构建 并返回一个字符串
        String compact = builder.compact();
        System.out.println("生成token---->>" + compact);
        Claims claims = Jwts.parser().setSigningKey("feizhou").parseClaimsJws(compact).getBody();
        System.out.println("解析token---->>" + claims);
        
        // 生成token---->>eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE2MDg2MDMzNjcsInVzZXJOYW1lIjoi5bCP5piOIiwidXNlcklkIjoxfQ.YkS4n4Gs8r9LkuTkBq3iVGjbbtNKF2qBlI6JFDK_3gA
        // 解析token---->>{jti=888, sub=小白, iat=1608603367, userName=小明, userId=1}
    }
    
}
